# source.entry

- **类型：**

```ts
type Entry = Record<
  string,
  string | string[] | (Rspack.EntryDescription & { html?: boolean })
>;
```

- **默认值：**

```ts
const defaultEntry = {
  // 默认支持其他后缀，如 ts、tsx、jsx、mjs、cjs
  index: 'src/index.js',
};
```

用于设置构建的入口模块。

`source.entry` 的用法与 Rspack 的 [entry](https://rspack.dev/config/entry) 选项类似，它们的主要区别在于，Rsbuild 会为 `source.entry` 中的每一个入口注册 [html-rspack-plugin](https://github.com/rspack-contrib/html-rspack-plugin)，从而生成对应的 HTML 文件。

- **示例：**

```ts title="rsbuild.config.ts"
export default {
  source: {
    entry: {
      foo: './src/pages/foo/index.ts',
      bar: './src/pages/bar/index.ts',
    },
  },
};
```

生成的目录结构如下：

```text
.
├── foo.html
├── bar.html
└── static
    ├── css
    │   ├── foo.css
    │   └── bar.css
    └── js
        ├── foo.js
        └── bar.js
```

如果你不需要生成 HTML 文件，可以将 [tools.htmlPlugin](/config/tools/html-plugin) 设置为 `false` 来禁用这一行为。

## 描述对象

`source.entry` 同样支持 Rspack 的 entry 描述对象写法，比如：

```ts title="rsbuild.config.ts"
export default {
  source: {
    entry: {
      foo: {
        import: './src/foo.js',
        runtime: 'foo',
      },
      bar: {
        import: './src/bar.js',
        runtime: 'bar',
      },
    },
  },
};
```

Rsbuild 为描述对象添加了 `html` 属性，用于控制是否生成 HTML 文件。

例如，`bar` 入口不生成 HTML 文件：

```ts title="rsbuild.config.ts"
export default {
  source: {
    entry: {
      foo: './src/foo.js',
      bar: {
        import: './src/bar.js',
        html: false,
      },
    },
  },
};
```

> 关于描述对象的完整用法，请参考 [Rspack - 入口描述对象](https://rspack.dev/config/entry#%E5%85%A5%E5%8F%A3%E6%8F%8F%E8%BF%B0%E5%AF%B9%E8%B1%A1)。

## 基于 environment 设置

当你面向多个 [environments](/config/environments) 构建时，可以为每个 environment 设置不同的 entry：

比如为 `web` 和 `node` 环境设置不同的 entry：

```js
export default {
  environments: {
    web: {
      source: {
        entry: {
          index: './src/index.client.js',
        },
      },
      output: {
        target: 'web',
      },
    },
    node: {
      source: {
        entry: {
          index: './src/index.server.js',
        },
      },
      output: {
        target: 'node',
      },
    },
  },
};
```
